home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / MiniGL / demos / warp.c < prev   
Encoding:
C/C++ Source or Header  |  2000-04-07  |  6.7 KB  |  331 lines

  1. /*
  2.     warp.c
  3.  
  4.     This is an example of what extreme field of view can do.....
  5.  
  6. */
  7. #include <stdlib.h>
  8. #include <mgl/gl.h>
  9.  
  10. #include <math.h>
  11. #ifndef M_PI
  12. #define M_PI 3.14159265
  13. #endif
  14. #include <stdio.h>
  15.  
  16. GLint width=640; GLint height=480;
  17. GLfloat startilt = 0.0;
  18. GLfloat t_off = 0.0;
  19. GLfloat fov = 170.0;
  20.  
  21. typedef struct
  22. {
  23.     GLfloat x,y,z,u,v;
  24. } MyVertex;
  25.  
  26.  
  27. GLubyte *LoadPPM(char *name, GLint *w, GLint *h)
  28. {
  29.     int i;
  30.     unsigned long x,y;
  31.     FILE *f;
  32.     GLubyte *where;
  33.  
  34.     f = fopen(name, "r");
  35.  
  36.     if (!f)
  37.     {
  38.         *w = 0; *h=0;
  39.         return NULL;
  40.     }
  41.     #ifndef __STORM__
  42.     i = fscanf(f, "P6\n%ld %ld\n255\n",&x, &y);
  43.     #else
  44.     i = fscanf(f, "P6\n%ld\n%ld\n255\n", &x, &y);
  45.     #endif
  46.  
  47.     if (i!= 2)
  48.     {
  49.         printf("Error scanning PPM header\n");
  50.         fclose(f);
  51.         *w = 0; *h = 0;
  52.         return NULL;
  53.     }
  54.  
  55.     *w = x;
  56.     *h = y;
  57.  
  58.     where = malloc(x*y*3);
  59.     if (!where)
  60.     {
  61.         printf("Error out of Memory\n");
  62.         fclose(f);
  63.         *w = 0; *h = 0;
  64.         return NULL;
  65.     }
  66.  
  67.     i = fread(where, 1, x*y*3, f);
  68.     fclose(f);
  69.  
  70.     if (i != x*y*3)
  71.     {
  72.         printf("Error while reading file\n");
  73.         free(where);
  74.         *w = 0; *h = 0;
  75.         return NULL;
  76.     }
  77.  
  78.     return where;
  79. }
  80.  
  81.  
  82. BOOL TexInit(char *name, int num)
  83. {
  84.     GLubyte *tmap;
  85.     GLint x,y;
  86.  
  87.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  88.     glPixelStorei(GL_PACK_ALIGNMENT, 1);
  89.  
  90.     if (!name)
  91.     {
  92.         return FALSE;
  93.     }
  94.     else
  95.     {
  96.         tmap = LoadPPM(name, &x, &y);
  97.     }
  98.  
  99.     if (!tmap)
  100.         return FALSE;
  101.  
  102.     glBindTexture(GL_TEXTURE_2D, num);
  103.     glTexImage2D(GL_TEXTURE_2D, 0, 3,
  104.         x,y, 0, GL_RGB, GL_UNSIGNED_BYTE, tmap);
  105.     free(tmap);
  106.  
  107.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  108.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  109.  
  110.     glEnable(GL_TEXTURE_2D);
  111.  
  112.     return TRUE;
  113. }
  114.  
  115. static void drawFlare(GLint texnum)
  116. {
  117.     GLfloat x,y,w,h;
  118.  
  119.     w=width/10.0;
  120.     h=w;
  121.  
  122.     x=width/2.0-w/2.0;
  123.     y=height/2.0-h/2.0;
  124.  
  125.  
  126.     glBindTexture(GL_TEXTURE_2D, texnum);
  127.     glEnable(GL_BLEND);
  128.     glBlendFunc(GL_ONE, GL_ONE);
  129.     /*
  130.     ** An MGL_FLATFAN is a shortcut to draw something into the
  131.     ** screen that does not go through the transformation pipeline.
  132.     ** This is also not clipped, so you have to take care to avoid
  133.     ** going over the edges, or clip yourself.
  134.     */
  135.     glBegin(MGL_FLATFAN);
  136.         glTexCoord2f(0.0, 0.0);
  137.         glVertex2f(x,y);
  138.         glTexCoord2f(1.0, 0.0);
  139.         glVertex2f(x+w, y);
  140.         glTexCoord2f(1.0, 1.0);
  141.         glVertex2f(x+w,y+h);
  142.         glTexCoord2f(0.0, 1.0);
  143.         glVertex2f(x,y+h);
  144.     glEnd();
  145.     glDisable(GL_BLEND);
  146. }
  147.  
  148.  
  149. static void drawStarField(GLint tex1, GLfloat off)
  150. {
  151.     GLfloat w = 1.0;
  152.     #define BACKPLANE -8.0
  153.     #define TEXTU 0.0
  154.     #define TEXTV 2.0
  155.  
  156.     glBindTexture(GL_TEXTURE_2D, tex1);
  157.     glBegin(GL_QUADS);
  158.  
  159.         glTexCoord2f(TEXTU, TEXTV+off);
  160.         glVertex3f(-1.0,  1.0,  BACKPLANE);
  161.         glTexCoord2f(TEXTU, off);
  162.         glVertex3f(-1.0,  1.0,   1.0);
  163.         glTexCoord2f(1.0, off);
  164.         glVertex3f(-1.0, -1.0,   1.0);
  165.         glTexCoord2f(1.0, TEXTV+off);
  166.         glVertex3f(-1.0, -1.0,  BACKPLANE);
  167.  
  168.         glTexCoord2f(TEXTU, TEXTV+off);
  169.         glVertex3f( 1.0,  1.0,  BACKPLANE);
  170.         glTexCoord2f(TEXTU, off);
  171.         glVertex3f( 1.0,  1.0,   1.0);
  172.         glTexCoord2f(1.0, off);
  173.         glVertex3f( 1.0, -1.0,   1.0);
  174.         glTexCoord2f(1.0, TEXTV+off);
  175.         glVertex3f( 1.0, -1.0,  BACKPLANE);
  176.  
  177.         glTexCoord2f(TEXTU, TEXTV+off);
  178.         glVertex3f(-1.0,  1.0,  BACKPLANE);
  179.         glTexCoord2f(TEXTU, off);
  180.         glVertex3f(-1.0,  1.0,   1.0);
  181.         glTexCoord2f(1.0, off);
  182.         glVertex3f( 1.0,  1.0,   1.0);
  183.         glTexCoord2f(1.0, TEXTV+off);
  184.         glVertex3f( 1.0,  1.0,  BACKPLANE);
  185.  
  186.         glTexCoord2f(TEXTU, TEXTV+off);
  187.         glVertex3f(-1.0, -1.0,  BACKPLANE);
  188.         glTexCoord2f(TEXTU, off);
  189.         glVertex3f(-1.0, -1.0,   1.0);
  190.         glTexCoord2f(1.0, off);
  191.         glVertex3f( 1.0, -1.0,   1.0);
  192.         glTexCoord2f(1.0, TEXTV+off);
  193.         glVertex3f( 1.0, -1.0,  BACKPLANE);
  194.  
  195.     glEnd();
  196.  
  197.  
  198. }
  199.  
  200.  
  201. void reshape(int w, int h)
  202. {
  203.     glMatrixMode(GL_PROJECTION);
  204.     glLoadIdentity();
  205.     gluPerspective(70.0, 1.3333333, 1.0, 100.0);
  206.  
  207.     glMatrixMode(GL_MODELVIEW);
  208.     glViewport(0, 0, w, h);
  209.     glClearColor(0.0f, 0.f, 0.f, 1.f);
  210.     glClearDepth(1.0);
  211. }
  212.  
  213. void DoFrame(void)
  214. {
  215.     glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
  216.  
  217.     glMatrixMode(GL_PROJECTION);
  218.     glLoadIdentity();
  219.     gluPerspective(fov, 1.3333333, 1.0, 100.0);
  220.  
  221.     glMatrixMode(GL_MODELVIEW);
  222.     glLoadIdentity();
  223.  
  224.     glScalef(20.0, 20.0, 20.0);
  225.     glRotatef(startilt, 0.0, 0.0, 1.0);
  226.     glDisable(GL_CULL_FACE);
  227.  
  228.     drawStarField(1, t_off);
  229.     drawFlare(2);
  230.  
  231.     startilt += 0.1;
  232.     t_off += 0.007;
  233.  
  234.     mglSwitchDisplay();
  235. }
  236.  
  237.  
  238. void keys(char c)
  239. {
  240.  
  241.     switch (c)
  242.     {
  243.         case 0x1b:
  244.             mglExit();
  245.             break;
  246.         case '+':
  247.             if (fov < 165.0)
  248.                 fov += 5.0;
  249.             break;
  250.         case '-':
  251.             if (fov > 30)
  252.                 fov -= 5.0;
  253.             break;
  254.     }
  255.  
  256. }
  257.  
  258. int main(int argc, char *argv[])
  259. {
  260.     int i;
  261.     char *filename = "data/stars.ppm";
  262.     char *flarename = "data/flare.ppm";
  263.  
  264.     for (i=1; i<argc; i++)
  265.     {
  266.         if (0 == stricmp(argv[i], "-width"))
  267.         {
  268.             i++;
  269.             width = atoi(argv[i]);
  270.         }
  271.         if (0 == stricmp(argv[i], "-height"))
  272.         {
  273.             i++;
  274.             height = atoi(argv[i]);
  275.         }
  276.         if (0 == stricmp(argv[i], "-window"))
  277.         {
  278.             mglChooseWindowMode(GL_TRUE);
  279.         }
  280.         if (0 == stricmp(argv[i], "-texture"))
  281.         {
  282.             i++;
  283.             filename = argv[i];
  284.         }
  285.         if (0 == stricmp(argv[i], "-flare"))
  286.         {
  287.             i++;
  288.             flarename = argv[i];
  289.         }
  290.     }
  291.  
  292.     MGLInit();
  293.  
  294.     mglChooseVertexBufferSize(1000);
  295.     mglChooseNumberOfBuffers(3);
  296.     mglCreateContext(0,0,width,height);
  297.     mglEnableSync(GL_FALSE);
  298.  
  299.     glClearColor(0.0, 0.0, 0.0, 0.0);
  300.     reshape(width, height);
  301.     glDisable(GL_DEPTH_TEST);
  302.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  303.  
  304.  
  305.     if ( TexInit(filename, 1) && TexInit(flarename, 2) )
  306.     {
  307.         glClearColor(0.0, 0.0, 0.0, 1.0);
  308.         glColor3f(1.0, 1.0, 1.0);
  309.         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  310.  
  311.         glHint(MGL_W_ONE_HINT, GL_FASTEST);
  312.         glEnable(GL_TEXTURE_2D);
  313.         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  314.  
  315.  
  316.         mglLockMode(MGL_LOCK_SMART);
  317.         mglIdleFunc(DoFrame);
  318.         mglKeyFunc(keys);
  319.         mglMainLoop();
  320.     }
  321.     else
  322.     {
  323.         printf("Can't load textures\n");
  324.     }
  325.  
  326.     mglDeleteContext();
  327.     MGLTerm();
  328.     return 0;             /* ANSI C requires main to return int. */
  329. }
  330.  
  331.